package cn.itcast.bos.service.auth.impl;

import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.itcast.bos.dao.auth.FunctionDao;
import cn.itcast.bos.dao.auth.RoleDao;
import cn.itcast.bos.domain.auth.Function;
import cn.itcast.bos.domain.auth.Role;
import cn.itcast.bos.service.auth.RoleService;

@Service("roleService")
@Transactional
public class RoleServiceImpl implements RoleService {

	@Autowired
	private RoleDao roleDao;
	@Autowired
	private FunctionDao functionDao;

	public List<Role> findAllRoles() {
		return roleDao.findAll();
	}

	public List<Role> findAllRolesByUserId(String id) {
		return roleDao.findAllRolesByUserId(id);
	}

	public void save(Role model, String functionIds) {
		// roleDao 判断 functionIds
		roleDao.saveAndFlush(model);// 该方法可以获取 主键id
		if (StringUtils.isNotBlank(functionIds)) {
			String ids[] = functionIds.split(",");
			for (String id : ids) {
				// 循环添加中间数据 jpa 对象操作 添加中间表 == 操作集合 添加数据 就是中间表数据添加
				// Function f = functionDao.findOne(id);// function 持久态 每一次查询 都会连接数据库 查询 ... 导致 频繁查询 性能问题
				// 如何优化? 查询语句不需要 考虑 中间表需要 id 关联操作的 集合对象 考虑 托管对象
				// 托管态...对象 和session 无关 但是 和数据库 对应oid
				Function f = new Function();
				f.setId(id);// f 托管态 推荐使用托管状态
				model.getFunctions().add(f);// 托管态中间表的添加? 答案是不可以的 因为 Role 操作中间表数据 试图 级联更新 Function 表
				// 所以 Role 实体类 一定不要配置级联
			}
		}
	}

	// 问题: 执行代码 role 添加一条记录 中间表也添加对应数据

	public Page<Role> findAll(Pageable pageRequest) {
		// TODO Auto-generated method stub
		return roleDao.findAll(pageRequest);
	}

}
